if(!window.pa){
	pa={};
}
pa.contextPath="/pa18shoplife";
pa.submitURI=pa.contextPath+"/engine.ajax";
pa.flowId='';
pa.set=function(params){
	for(var k in params){
		if(k){
			pa[k]=params[k];
		}
	}
}
pa.init=function(flowId){if(flowId){pa.flowId=flowId;}}


function getParaFromUrl(key) {
	if(key == null || typeof(key) == undefined || key =="") 
		return "";
	var theUrl = window.location.href;
	var mediaSource='';
	var paramIndex = theUrl.indexOf(key);
	if(paramIndex != -1) {
		mediaSource = theUrl.substring(paramIndex);
		var pIndex = mediaSource.indexOf("&");
		if(pIndex != -1) {
			mediaSource = mediaSource.substring(0,pIndex);
		}
		mediaSource = mediaSource.substring(key.length+1);
	}else {
		mediaSource = "";
	}
	
	return mediaSource;
}

//定义校验全局变量
var validateFail = false;

function RequestDefined(reqId,validators){
	this.reqId=reqId;
	this.validators=validators;
	this.vc=new ValidateContext(validators);
}

RequestDefined.prototype={
	
	submit:function(params,callback,beforesend,errorback){
		var mediaSource = getParaFromUrl("WT.mc_id");
		var activeMedia = getParaFromUrl("MS.active_id");
		var uri=pa.submitURI+"?flowId="+pa.flowId+"&reqId="+this.reqId+"&WT.mc_id="+mediaSource+"&MS.active_id="+activeMedia;
		var json=null;
		if(params){
			json=Utils.obj2json(params);
		}
		$.ajax({type: "POST",url: uri,data: json,success: function(str){
		   //if(window.console)console.log(str);
			var datas=null;
			try{
			  datas=eval("("+str+")");
			}catch(e){
				var msg='json数据格式错误:'+str;
			   if(window.console){
			   	 console.error(msg);
			   }else{
			   	 window.alert(msg);
			   }
			}
			callback(datas);
		},error: function (){if(typeof(errorback)=="function")errorback()},
		beforeSend: function(){if(typeof(beforesend)=="function")beforesend()},
		contentType:"text/plain"}); 
	},
	submitInputs:function(wrapElementIds,callback,beforesend,errorback){
		var params=Utils.inputs2obj(wrapElementIds);
		//alert(params);
		this.submit(params,callback,beforesend,errorback);
	},
	validateForm:function(wrapElementId,checkNull){
		return this.vc.validate($('#'+wrapElementId),null,checkNull);
	},
	validateFormItem:function(formId,itemName,checkNull){
		var errors=this.vc.validate($('#'+formId),itemName,checkNull);
		if(errors && errors.length>0){
			return errors[0];
		}
		return null;
	},
	validate:function(wrapElement,itemName,checkNull){
		return this.vc.validate(wrapElement,itemName,checkNull);
	}
};

function ValidateContext(validators){
	this.validators = validators;
}

ValidateContext.prototype={
	validate:function(wrapElement,itemName,checkNull){
		var me = this;
		var datas={};
		$("input[name="+itemName+"],select[name="+itemName+"],textarea[name="+itemName+"]",wrapElement).not(':disabled').each(function(i,e){
			e=$(e);
			var name=e.attr('name');
  			if(!name)return;
  			if(itemName && itemName!=name){
  				return ;
  			}
  			var v=e.val();
  			if(typeof(e.attr('type')) != 'undefined'){
			switch (e.attr('type').toLowerCase()) {
		       case 'checkbox':
		       {
		    	   if (!e.attr('checked')) 
		    	   {
		    		   v=null;
		    	   }
		       }
		       case 'radio':
		       {
		    	   if (!e.attr('checked')) 
		    	   {
		    		   v=null;
		    		   break;
		    	   }
		       }
		    }
  			}
	        if(v){
	           v=v.replace(/(^\s*)|(\s*$)/g, "");
	        }
        	if(v=='')v=null;
        	if(!datas[name]){
        		datas[name]=[];
        	}
        	if(v!=null){
        		var arr=datas[name];
        		arr[arr.length]=v;
        	}

		});
		var errors=[];
		//------------------------
		for( var dname in datas){
			var m=me._validateItem(dname,datas[dname],checkNull);
			if(m!=null){
				errors[errors.length]=m;
			}
		}
		return errors;
	},
	_validateItem:function(name,values,checkNull){
		if(values.length==0){
			return this._validateValue(name,null,checkNull);
		}else if(values.length==1){
			return this._validateValue(name,values[0],checkNull);
		}else{
			for(var i=0;i<values.length;i++){
				return this._validateValue(name,values[i],checkNull);
			}
		}
	},
	_validateValue:function(name,v,checkNull){
		
		var arrValidate = new Array();
		var validator;
        var vName,ePrefix,ePostfix;
        
    	//如果校验器为insures.name,表单元素名称insures[0].name,则需要转换下
    	if(name.indexOf("[")>-1)
		{
			ePrefix = name.substring(0,name.indexOf("["));
			ePostfix = name.substring(name.indexOf("]")+1,name.length);
			
			vName = ePrefix + ePostfix;//重新组合名称
		}
    	//加入validator-config.js待校验项
    	if(window.commonValidators)
    	{
    		this._addValidator(arrValidate,window.commonValidators,name,vName);
    	}
    	
    	//加入页面待校验项
    	var pageValidator = this.validators;
    	if(pageValidator)
    	{
    		this._addValidator(arrValidate,pageValidator,name,vName);
    	}
    	
    	//开始根据Name和value进校验
        var validator;
        for(var i=0;i<arrValidate.length;i++)
        {
        	validator = arrValidate[i];
        	
        	//如果非空校验标识为true，则全部校验
    		if(checkNull)
    			validator.validator(v);
    		else
    			if(validator.ruleType!=5)validator.validator(v);//排除非空校验

    		//验证结果为不通过则返回验证
    		if(validateFail) 
    		{
    			var msg = {};//验证信息
    			msg.objName = name;//表单元素名称
    			msg.ruleType = validator.validateObj.ruleType;
    			return msg;//返回验证信息
    			break;//有一项验证不通过则跳出
    		}
        }
        return null;//返回验证信息
	},
	_addValidator:function(arrValidate,json,name,vName)
	{
		var eName;//元素名称
		var ruleType;//校验类型
		var len = arrValidate.length;

		var index = 0;
	    for(obj in json){
	        if(name == obj || vName == obj)
			{
	        	var arr = json[obj];
		        for(var j=0;j<arr.length;j++)
				{
		        	var validateObj = arr[j];
		        	ruleType = validateObj.ruleType;//验证类型
			        if(parseInt(ruleType))
			        {
			        	switch(ruleType)
				        {
					        case 1:
				        		arrValidate[len+index] = new LengthValidator(validateObj);
				        		break;
				        	case 2: 
				        		arrValidate[len+index] = new NumberValidator(validateObj);
				        		break;
				        	case 3:
				        		arrValidate[len+index] = new EnumsValidator(validateObj);
				        		break;
				        	case 4:
				        		arrValidate[len+index] = new RegexValidator(validateObj);
				        		break;
				        	case 5:
				        		arrValidate[len+index] = new NotNullValidator(validateObj);
				        		break;
				        	case 6:
				        		arrValidate[len+index] = new DateValidator(validateObj);
				        		break;
				        	default :
				        		break;
				        }
			        	
			        	index++;//下标计数
			        }
				}
			}
		}
	}
}

$(function(){
	
	function _inputsToObj(wrapEl,obj){
		if(!obj)obj={};
		$("input[name],select[name],textarea[name]",wrapEl).each(function(i,e){
  			 e=$(e);
  			 var name=e.attr('name');
  			 if(!name)return ;
  			 var v=e.val();
  			 if(typeof e.attr('type') != 'undefined'){  
	  			 switch (e.attr('type').toLowerCase()) {
		            case 'checkbox':
		            case 'radio':
		            if (!e.attr('checked')) {return; }
	            }
	            
	           	v=v.replace(/(^\s*)|(\s*$)/g, "");
	            _parseValue(obj,name,v);
  			 }
		});
		return obj;
	}
	//{},proid[0],12
	//
	function _parseValue(obj,name,value){
		var idx=name.indexOf('.');
		if(idx==-1){
			var i2=name.indexOf('[');
			if(i2!=-1){
				var arridx=parseInt(name.substring(i2+1,name.length-1));
                var arrName=name.substring(0,i2);
				if(!obj[arrName])obj[arrName]=[];
                var arr=obj[arrName];
				arr[arr.length]=value;
			}else{
				if(obj[name]){
					if(obj[name] instanceof Array){
						var arr=obj[name];
						arr[arr.length]=value;
					}else{
						var arr=[];
						arr[0]=obj[name];
						arr[1]=value;
						obj[name]=arr;
					}
				}else{
					obj[name]=value;
				}
			}
		}else{
            var n1= name.substring(0,idx);
            var i2=n1.indexOf('[');
            var n2=name.substring(idx+1);
           
            if(i2!=-1){
            	var temp=n1.substring(i2+1,n1.length-1);
                var arridx=-1;
                if(temp.length>0){
                	arridx=parseInt(temp);
                }
                var arrName=n1.substring(0,i2);
                var arr=obj[arrName];
                if(!arr){
                	arr=obj[arrName]=[];
                }
                if(arridx==-1)arridx=arr.length;
                if(!arr[arridx])arr[arridx]={};
                _parseValue(arr[arridx],n2,value);
            }else{
                 //alert(obj);
                 if(!obj[n1])obj[n1]={};
                 _parseValue(obj[n1],n2,value);
            }
        }
	}
	
	function _objToJson(o){
		if (o == undefined) {
             return "";
         }
         var r = [];
         if (typeof o == "string") return "\"" + o.replace(/([\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";
         if (typeof o == "object") {
             if (!o.sort) {
                 for (var i in o)
                     r.push("\"" + i + "\":" + _objToJson(o[i]));
                 if (!!document.all && !/^\n?function\s*toString\(\)\s*\{\n?\s*\[native code\]\n?\s*\}\n?\s*$/.test(o.toString)) {
                     r.push("toString:" + o.toString.toString());
                 }
                 r = "{" + r.join() + "}"
             } else {
                 for (var i = 0; i < o.length; i++)
                     r.push(_objToJson(o[i]))
                 r = "[" + r.join() + "]";
             }
             return r;
         }
         return o.toString().replace(/\"\:/g, '":""');
	}
	
	window.Utils={
		obj2json:function(obj){
			return _objToJson(obj);
		},
		inputs2obj:function(wrapElementIds){
			var obj={};
			if(wrapElementIds instanceof Array){
				for(var i=0;i<wrapElementIds.length;i++){
					_inputsToObj($('#'+wrapElementIds[i]),obj)
				}
			}else{
				 _inputsToObj($('#'+wrapElementIds),obj);
			}
			return obj;
		}
	};
	
});



/**
 * 校验器
 * 0自定义规则,1长度验证,2数值验证,3枚举验证,4正则表达式验证 5非空验证 6日期验证
 * */

/**
 * 1长度验证
 */
function LengthValidator(validateObj)
{
	this.validateObj = validateObj;
}

/**
 * 长度验证校验方法
 */
LengthValidator.prototype.validator=function(value){

	validateFail = false;//重置验证标识
	
	//计算长度
	if(!value) return false;

	var len=value.length;
	if(this.validateObj.byteUnit){
		var temp=0;
		for(var i=0;i<len;i++){
			if(value.charCodeAt(i)>256){
				temp+=2;
			}else{
				temp++;
			}
		}
		len=temp;
	}
	
	//比较最小值
	if (this.validateObj.min >= 0 && len < this.validateObj.min) { 
		validateFail = true;//小于最小值，设置验证不通过
		return false;
	}
	
	// 比较最大值
	if (this.validateObj.max >= 0 && len > this.validateObj.max) {
		if(this.truncate){
			var cutLen=this.validateObj.max;
			if(byteUnit){
				cutLen=0;
				for(var i=0;i<this.validateObj.max;){
					if(value.charCodeAt(i)>256){
						i+=2;
					}else{
						i++;
					}
					cutLen++;
				}
			}
			value = value.substring(0, cutLen);
			validateFail = false;
			return false;//返回
		}
		validateFail = true;//大于最大值，设置验证不通过
		return false;
	}
}

/**
 * 2数值验证
 */
function NumberValidator(validateObj)
{
	 this.validateObj = validateObj;
}

/**
 * 数值验证校验方法
 */
NumberValidator.prototype.validator=function(value){
	
	validateFail = false;//重置验证标识
	
	if(!value) return false;
	
	if(isNaN(value))
	{
		validateFail = true;//非数字，设置验证不通过
		return false;
	}

	value = parseFloat(value);//转换成数值

	if (this.validateObj.max >= 0 && value > this.validateObj.max) {// 比较最大值
		validateFail = true;//大于最大值，设置验证不通过
		return false;
	}

	if (this.validateObj.min >= 0 && value < this.validateObj.min) { //比较最小值
		validateFail = true;//小于最小值，设置验证不通过
		return false;
	}

	//验证精度
	if (this.validateObj.precision >= 0 ) {
		var temp = value.toString();
		var idx= temp.indexOf('.');
		var ps=0;//实际精度,0表示整数
		if(idx!=-1 && idx!=temp.length-1){
			ps=temp.substring(idx+1).length;//取得实际精度
		}
		if(ps>this.validateObj.precision){//实际精度大于限定精度为失败
			validateFail = true;//设置验证不通过
			return false;
		}
	}
}

/**
 * 3枚举验证
 */
function EnumsValidator(validateObj)
{
	 this.validateObj = validateObj;
}

/**
 * 枚举验证校验方法
 */
EnumsValidator.prototype.validator=function(value){
	
	validateFail = false;//重置验证标识
	
	if(!value) value ='';
	
	var exist = false;
	var arrOption = this.validateObj.options.toString().split(",");
	for (var i = 0;i < arrOption.length;i++) {
		if (value==arrOption[i]) {
			exist = true;
			break;
		}
	}
	if(exist)
	{
		validateFail = false;//设置验证通过
		return true;
	}
	else
	{
		validateFail = true;//设置验证不通过 
		return false;
	}
}

/**
 * 4正则表达式字符串
 */
function RegexValidator(validateObj)
{
	 this.validateObj = validateObj;
}

/**
 * 正则表达式校验方法
 */
RegexValidator.prototype.validator=function(value){
	
	validateFail = false;//重置验证标识
	
	if(!value) return false;
	
	var re = new RegExp(this.validateObj.pattern.toString(),"ig");
	if(re.test(value))
	{
		validateFail = false;//设置验证通过
		return true;
	}
	else
	{
		validateFail = true;//设置验证不通过
		return false;
	}
}

/**
 * 5非空验证
 */
function NotNullValidator(validateObj)
{
	 this.validateObj = validateObj;
}

/**
 * 非空验证校验方法
 */
NotNullValidator.prototype.validator=function(value){

	validateFail = false;//重置验证标识
	
	if(!value) value ='';
	
	if(value==null||value=="")
	{
		validateFail = true;//设置验证不通过
		return false;
	}
}

/**
 * 6日期验证
 */
function DateValidator(validateObj)
{
	 this.validateObj = validateObj;
}

/**
 * 日期验证校验方法
 */
DateValidator.prototype.validator=function(value){

	validateFail = false;//重置验证标识

	if(!value) return false;
	
	var compareFormat = this.validateObj.compareFormat;
	if(!compareFormat)
	{
		compareFormat = "yyyy-MM-dd";//设置默认格式
	}

	//验证日期是否符合格式(待补充)
	
	//转换日期格式
	if(compareFormat.toLowerCase() == "mm/dd/yyyy" || compareFormat.toLowerCase() == "mm-dd-yyyy")
	{
		value = value.replace(/(\d{1,2})[/-](\d{1,2})[/-](\d{4})/, '$3/$1/$2');
	}
	else if(compareFormat.toLowerCase() == "dd/mm/yyyy" || compareFormat.toLowerCase() == "dd-mm-yyyy") 
	{
		value = value.replace(/(\d{1,2})[/-](\d{1,2})[/-](\d{4})/, '$3/$2/$1');
	}
	
	value = value.replace(/-/g,"/").toString();
	var vDate = (new Date(value)).pattern(compareFormat);//待验证日期

	//比较最小项
	var min = this.validateObj.min;
	if(min)
	{
		var minDate;
		if(min.charAt(0)=='{'){
			minDate = parseDate(vDate,min,compareFormat);
		}else{
			minDate= (new Date(min.replace(/-/g,"/").toString())).pattern(compareFormat);
		}

		if(vDate < minDate){
			validateFail = true;//设置验证不通过
			return false;
		}
	}
	
	//比较最大项
	var max = this.validateObj.max;
	if(max)
	{
		var maxDate;
		if(max.charAt(0)=='{'){
			maxDate = parseDate(vDate,max,compareFormat);
		}else{
			maxDate= (new Date(max.replace(/-/g,"/").toString())).pattern(compareFormat);
		}

		if(vDate > maxDate){
			validateFail = true;//设置验证不通过
			return false;
		}
	}
	
}

/**
* 转换日期
* */
function parseDate(vDate,dateStr,fmt)
{
	var num=dateStr.substring(1,dateStr.length-2);
	if(num.charAt(0)=='+'){
		num=num.substring(1);
	}
	var t = parseInt(num);
	var sper=dateStr.charAt(dateStr.length-2);
	
	var newDate = DateAdd(sper,t,new Date());
	newDate = new Date(newDate).pattern(fmt);
	return newDate;
}

/**
 *   功能:实现VBScript的DateAdd功能.
 *   参数:interval,字符串表达式，表示要添加的时间间隔.
 *   参数:number,数值表达式，表示要添加的时间间隔的个数.
 *   参数:date,时间对象.
 *   返回:新的时间对象.
 *   var now = new Date();
 *   var newDate = DateAdd( "d ",5,now);
 *---------------   DateAdd(interval,number,date)   -----------------
 */
function DateAdd(interval,number,date)
{

   switch(interval.toLowerCase())
   {
       case "y" : {
           date.setFullYear(date.getFullYear()+number);
           return date;
           break;
       }
       case  "m" : {
           date.setMonth(date.getMonth()+number);
           return date;
           break;
	    }
       case "q" : {
           date.setMonth(date.getMonth()+number*3);
           return date;
           break;
       }
       case  "w" : {
           date.setDate(date.getDate()+number*7);
           return date;
           break;
       }
       case  "d" : {
           date.setDate(date.getDate()+number);
           return date;
           break;
       }
       case  "h" : {
           date.setHours(date.getHours()+number);
           return date;
           break;
       }
       case  "s": {
           date.setSeconds(date.getSeconds()+number);
           return   date;
           break;
       }
       default : {
           date.setDate(d.getDate()+number);
           return date;
           break;
       }
   }
}

/**   js日期格式化
* 对Date的扩展，将 Date 转化为指定格式的String
* 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 个占位符
* 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
* eg:
* (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
* (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04
* (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04
* (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04
* (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
*/
Date.prototype.pattern=function(fmt) {

	var o = {
		"M+" : this.getMonth()+1, //月份
		"d+" : this.getDate(), //日
		"h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时
		"H+" : this.getHours(), //小时
		"m+" : this.getMinutes(), //分
		"s+" : this.getSeconds(), //秒
		"q+" : Math.floor((this.getMonth()+3)/3) //季度
	};
	
	var week = {
		"0" : "/u65e5",
		"1" : "/u4e00",
		"2" : "/u4e8c",
		"3" : "/u4e09",
		"4" : "/u56db",
		"5" : "/u4e94",
		"6" : "/u516d"
	};
	if(/(y+)/.test(fmt)){
		fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
	}
	if(/(E+)/.test(fmt)){
		fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "/u661f/u671f" : "/u5468") : "")+week[this.getDay()+""]);
	}
	for(var k in o){
		if(new RegExp("("+ k +")").test(fmt)){
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
		}
	}
	return fmt;
}